大家安安,今天過得好嗎?
寫這篇主要是想複習自己的DI觀念
之後也會介紹 Dagger in Android 跟 Spring Boot銜接
那就 開始吧?
DI的英文是Dependency Injection,中文叫依賴注入
A:主要是要處理 耦合性過高 的問題,才方便修改和做單元測試
好處
1.低耦合
2.更清晰的意圖
3.可維護性提高
4.可測試性
舉個耦合性過高的例子
class A(){
//...
private Sring hello="";
String hello(String hello){
this.hello=hello;
return "aacutty"+hello;
}
}
class B(){
A aa=new A();
aa.hello("wow");
}
因為是用new Class的方式,所以一旦A生產的方式有改變 && 需要替代掉A (不想用A)之類的,這樣B class內的方法也需要修改。
若是做單元測試,以Spring Boot為例,你若想測試單一Class卻不想測試到資料庫,但是Class 與資料庫緊緊耦合在一起(ex new)那就不能拆開來測試了
若做DI,則能輕鬆將原本依賴的真實物件替換為mock物件
如果要把A class 改成 C class,我們可以用interface的方式實現,
這樣就不會因為要修改所以改動大一堆邏輯
當要決定與誰耦合只需要改動setICU(new A())裡面的參數
如果要同時改動hello方法的參數,也可以直接改動interface ICA內傳入為甚麼
public interface ICA {
public hello(String hello);
}
class A() implements ICA{
//...
private Sring hello="";
@Override
String hello(String hello){
return "aacutty"+hello;
}
}
class C() implements ICA{
//...
private Sring hello="";
@Override
String hello(String hello){
this.hello=hello;
return "ccutty"+hello;
}
}
class B(){
/* A aa=new A();
aa.hello("wow"); */
private ICA ica;
public void setICU(ICA ica) {
this.ica = ica;
}
//決定跟誰耦合
// setICU(new A())
// setICU(new C())
ica.hello();
}
constructer 的方式就是在construter將所有需要依賴注入的東西傳進去
好處就是一次傳完,相較於set
不過如果是要傳很多東西還是用set比較好,因為又比較分離一點修改比較方便
public interface ICA {
public hello(String hello);
}
class A() implements ICA{
//...
private Sring hello="";
@Override
String hello(String hello){
return "aacutty"+hello;
}
}
class C() implements ICA{
//...
private Sring hello="";
@Override
String hello(String hello){
this.hello=hello;
return "ccutty"+hello;
}
}
class B(){
private ICA ica;
class B(ICA ica){
this.ica=ica;
}
}
然後Spring Boot 底層就是IOC容器,等於只要加一些他要求的就可以直接注入了!!
相較於Spring要在config (xml) 中修改更方便許多
Android 的話 , Dagger可以幫你不用每次都new一個東西,如果想要在不同Class中拿到同一個object ,除了用傳遞的方式也可以用Dagger,只要綁同一個Scope,Component拿到的就是同一個 (因為不用重new),也可以節省重new很多重複東西的功夫
這兩者一樣有DI的方便性,若是熟悉就會易修改易處理,Dagger也是用@annotation的方式,如果有錯誤在編譯時期就會報錯
大概是這樣,如果有說錯可以跟我說~
之後會分別介紹 Dagger && Spring Boot